"""
PROJECT: django_celery_demo
FILE: tasks.py
AUTHOR: wensen
CREATE: 2022-03-01 
"""
import datetime
import time

import requests
from celery import shared_task

from task_app.models import Orders
from . import app


# 异步任务 可以手动调用
@shared_task
def add(x, y):
    return x + y


@shared_task
def mul(x, y):
    return x * y


"""
@task与@shared_task的区别
当我们使用@app.task装饰器定义我们的异步任务时，那么这个任务依赖于根据项目名生成的Celery实例。
然而我们在进行Django开发时为了保证每个app的可重用性，
我们经常会在每个app文件夹下编写异步任务，这些任务并不依赖于具体的Django项目名。
使用@shared_task 装饰器能让我们避免对某个项目名对应Celery实例的依赖，使app的可移植性更强。
"""


@app.task
def ab_sum(a, b):
    return a + b


# 定时任务 启动就按照配置时间执行
@shared_task
def del_goods():
    print("间隔任务开始")
    # orders = Orders.objects.filter(payment_due_time__lte=datetime.datetime.now(), payment_status__in=(1, 2, 3))
    # print(orders)
    # orders.update(payment_status=4)
    time.sleep(5)
    print("间隔任务结束")


# 自定义的定时任务
@shared_task
def custom_task(url, method, params=None, json=None, headers=None):
    if params and not isinstance(params, dict):
        raise Exception("params参数为字典格式")
    if json and not isinstance(json, dict):
        raise Exception("data参数为字典格式")
    if not url:
        raise Exception("url参数未配置")
    if not method:
        raise Exception("method参数未配置")
    if params and json:
        query_params = {"url": url, "params": params, "json": json}
    elif params:
        query_params = {"url": url, "params": params, "json": json}
    else:
        query_params = {"url": url}
    if method.upper() == "GET":
        res = requests.get(**query_params, headers=headers)
    elif method.upper() == "POST":
        res = requests.post(**query_params, headers=headers)
    else:
        raise Exception("method参数只支持GET|POST")
    return {"status": "任务执行完成", "response": res.json()}
